{
  "nbformat": 4, 
  "nbformat_minor": 0, 
  "metadata": {
    "colab": {
      "name": "Try Apache Beam - Java", 
      "version": "0.3.2", 
      "provenance": [], 
      "collapsed_sections": [], 
      "toc_visible": true, 
      "include_colab_link": true
    }, 
    "kernelspec": {
      "name": "python3", 
      "display_name": "Python 3"
    }
  }, 
  "cells": [
    {
      "cell_type": "markdown", 
      "metadata": {
        "id": "view-in-github", 
        "colab_type": "text"
      }, 
      "source": [
        "<a href=\"https://colab.research.google.com/github/apache/beam/blob/master/examples/notebooks/get-started/try-apache-beam-java.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    }, 
    {
      "cell_type": "code",
      "execution_count": null,
      "source": [
        "#@title ###### Licensed to the Apache Software Foundation (ASF), Version 2.0 (the \"License\")\n",
        "\n",
        "# Licensed to the Apache Software Foundation (ASF) under one\n",
        "# or more contributor license agreements. See the NOTICE file\n",
        "# distributed with this work for additional information\n",
        "# regarding copyright ownership. The ASF licenses this file\n",
        "# to you under the Apache License, Version 2.0 (the\n",
        "# \"License\"); you may not use this file except in compliance\n",
        "# with the License. You may obtain a copy of the License at\n",
        "#\n",
        "#   http://www.apache.org/licenses/LICENSE-2.0\n",
        "#\n",
        "# Unless required by applicable law or agreed to in writing,\n",
        "# software distributed under the License is distributed on an\n",
        "# \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n",
        "# KIND, either express or implied. See the License for the\n",
        "# specific language governing permissions and limitations\n",
        "# under the License."
      ],
      "outputs": [],
      "metadata": {
        "cellView": "form"
      }
    },
    {
      "metadata": {
        "id": "lNKIMlEDZ_Vw", 
        "colab_type": "text"
      }, 
      "cell_type": "markdown", 
      "source": [
        "# Try Apache Beam - Java\n", 
        "\n", 
        "In this notebook, we set up a Java development environment and work through a simple example using the [DirectRunner](https://beam.apache.org/documentation/runners/direct/). You can explore other runners with the [Beam Capatibility Matrix](https://beam.apache.org/documentation/runners/capability-matrix/).\n", 
        "\n", 
        "To navigate through different sections, use the table of contents. From **View**  drop-down list, select **Table of contents**.\n", 
        "\n", 
        "To run a code cell, you can click the **Run cell** button at the top left of the cell, or by select it and press **`Shift+Enter`**. Try modifying a code cell and re-running it to see what happens.\n", 
        "\n", 
        "To learn more about Colab, see [Welcome to Colaboratory!](https://colab.sandbox.google.com/notebooks/welcome.ipynb)."
      ]
    }, 
    {
      "metadata": {
        "id": "Fz6KSQ13_3Rr", 
        "colab_type": "text"
      }, 
      "cell_type": "markdown", 
      "source": [
        "# Setup\n", 
        "\n", 
        "First, you need to set up your environment."
      ]
    }, 
    {
      "metadata": {
        "id": "GOOk81Jj_yUy", 
        "colab_type": "code", 
        "outputId": "68240031-2990-41fa-a327-38e15dc9fdf9", 
        "colab": {
          "base_uri": "https://localhost:8080/", 
          "height": 136
        }
      }, 
      "cell_type": "code", 
      "source": [
        "# Run and print a shell command.\n", 
        "def run(cmd):\n", 
        "  print('>> {}'.format(cmd))\n", 
        "  !{cmd}  # This is magic to run 'cmd' in the shell.\n", 
        "  print('')\n", 
        "\n", 
        "# Copy the input file into the local filesystem.\n", 
        "run('mkdir -p data')\n", 
        "run('gsutil cp gs://dataflow-samples/shakespeare/kinglear.txt data/')"
      ], 
      "execution_count": 1, 
      "outputs": [
        {
          "output_type": "stream", 
          "text": [
            ">> mkdir -p data\n", 
            "\n", 
            ">> gsutil cp gs://dataflow-samples/shakespeare/kinglear.txt data/\n", 
            "Copying gs://dataflow-samples/shakespeare/kinglear.txt...\n", 
            "/ [1 files][153.6 KiB/153.6 KiB]                                                \n", 
            "Operation completed over 1 objects/153.6 KiB.                                    \n", 
            "\n"
          ], 
          "name": "stdout"
        }
      ]
    }, 
    {
      "metadata": {
        "id": "Hmto8JTSWwUK", 
        "colab_type": "text"
      }, 
      "cell_type": "markdown", 
      "source": [
        "## Installing development tools\n", 
        "\n", 
        "Let's start by installing Java. We'll use the `default-jdk`, which uses [OpenJDK](https://openjdk.java.net/). This will take a while, so feel free to go for a walk or do some stretching.\n", 
        "\n", 
        "**Note:** Alternatively, you could install the propietary [Oracle JDK](https://www.oracle.com/technetwork/java/javase/downloads/index.html) instead."
      ]
    }, 
    {
      "metadata": {
        "id": "ONYtX0doWpFz", 
        "colab_type": "code", 
        "outputId": "04bfa861-0bf8-4352-e878-0f24c6c7b61e", 
        "colab": {
          "base_uri": "https://localhost:8080/", 
          "height": 187
        }
      }, 
      "cell_type": "code", 
      "source": [
        "# Update and upgrade the system before installing anything else.\n", 
        "run('apt-get update > /dev/null')\n", 
        "run('apt-get upgrade > /dev/null')\n", 
        "\n", 
        "# Install the Java JDK.\n", 
        "run('apt-get install default-jdk > /dev/null')\n", 
        "\n", 
        "# Check the Java version to see if everything is working well.\n", 
        "run('javac -version')"
      ], 
      "execution_count": 2, 
      "outputs": [
        {
          "output_type": "stream", 
          "text": [
            ">> apt-get update > /dev/null\n", 
            "\n", 
            ">> apt-get upgrade > /dev/null\n", 
            "Extracting templates from packages: 100%\n", 
            "\n", 
            ">> apt-get install default-jdk > /dev/null\n", 
            "\n", 
            ">> javac -version\n", 
            "javac 10.0.2\n", 
            "\n"
          ], 
          "name": "stdout"
        }
      ]
    }, 
    {
      "metadata": {
        "id": "Wab7H4IZW9xZ", 
        "colab_type": "text"
      }, 
      "cell_type": "markdown", 
      "source": [
        "Now, let's install [Gradle](https://gradle.org/), which we'll need to automate the build and running processes for our application. \n", 
        "\n", 
        "**Note:** Alternatively, you could install and configure [Maven](https://maven.apache.org/) instead."
      ]
    }, 
    {
      "metadata": {
        "id": "xS3Oeu3DW7vy", 
        "colab_type": "code", 
        "outputId": "1b2c1f11-5e35-4d22-8002-814ea61224c9", 
        "colab": {
          "base_uri": "https://localhost:8080/", 
          "height": 595
        }
      }, 
      "cell_type": "code", 
      "source": [
        "import os\n", 
        "\n", 
        "# Download the gradle source.\n", 
        "gradle_version = 'gradle-5.0'\n", 
        "gradle_path = f\"/opt/{gradle_version}\"\n", 
        "if not os.path.exists(gradle_path):\n", 
        "  run(f\"wget -q -nc -O gradle.zip https://services.gradle.org/distributions/{gradle_version}-bin.zip\")\n", 
        "  run('unzip -q -d /opt gradle.zip')\n", 
        "  run('rm -f gradle.zip')\n", 
        "\n", 
        "# We're choosing to use the absolute path instead of adding it to the $PATH environment variable.\n", 
        "def gradle(args):\n", 
        "  run(f\"{gradle_path}/bin/gradle --console=plain {args}\")\n", 
        "\n", 
        "gradle('-v')"
      ], 
      "execution_count": 3, 
      "outputs": [
        {
          "output_type": "stream", 
          "text": [
            ">> wget -q -nc -O gradle.zip https://services.gradle.org/distributions/gradle-5.0-bin.zip\n", 
            "\n", 
            ">> unzip -q -d /opt gradle.zip\n", 
            "\n", 
            ">> rm -f gradle.zip\n", 
            "\n", 
            ">> /opt/gradle-5.0/bin/gradle --console=plain -v\n", 
            "\u001b[m\n", 
            "Welcome to Gradle 5.0!\n", 
            "\n", 
            "Here are the highlights of this release:\n", 
            " - Kotlin DSL 1.0\n", 
            " - Task timeouts\n", 
            " - Dependency alignment aka BOM support\n", 
            " - Interactive `gradle init`\n", 
            "\n", 
            "For more details see https://docs.gradle.org/5.0/release-notes.html\n", 
            "\n", 
            "\n", 
            "------------------------------------------------------------\n", 
            "Gradle 5.0\n", 
            "------------------------------------------------------------\n", 
            "\n", 
            "Build time:   2018-11-26 11:48:43 UTC\n", 
            "Revision:     7fc6e5abf2fc5fe0824aec8a0f5462664dbcd987\n", 
            "\n", 
            "Kotlin DSL:   1.0.4\n", 
            "Kotlin:       1.3.10\n", 
            "Groovy:       2.5.4\n", 
            "Ant:          Apache Ant(TM) version 1.9.13 compiled on July 10 2018\n", 
            "JVM:          10.0.2 (Oracle Corporation 10.0.2+13-Ubuntu-1ubuntu0.18.04.4)\n", 
            "OS:           Linux 4.14.79+ amd64\n", 
            "\n", 
            "\u001b[m\n"
          ], 
          "name": "stdout"
        }
      ]
    }, 
    {
      "metadata": {
        "id": "YTkkapX9KVhA", 
        "colab_type": "text"
      }, 
      "cell_type": "markdown", 
      "source": [
        "## build.gradle\n", 
        "\n", 
        "We'll also need a [`build.gradle`](https://guides.gradle.org/creating-new-gradle-builds/) file which will allow us to invoke some useful commands."
      ]
    }, 
    {
      "metadata": {
        "id": "oUqfqWyMuIfR", 
        "colab_type": "code", 
        "outputId": "292a06b2-ce06-46b6-8598-480d83974bbb", 
        "colab": {
          "base_uri": "https://localhost:8080/", 
          "height": 34
        }
      }, 
      "cell_type": "code", 
      "source": [
        "%%writefile build.gradle\n", 
        "\n", 
        "plugins {\n", 
        "  // id 'idea'     // Uncomment for IntelliJ IDE\n", 
        "  // id 'eclipse'  // Uncomment for Eclipse IDE\n", 
        "\n", 
        "  // Apply java plugin and make it a runnable application.\n", 
        "  id 'java'\n", 
        "  id 'application'\n", 
        "\n", 
        "  // 'shadow' allows us to embed all the dependencies into a fat jar.\n", 
        "  id 'com.gradleup.shadow' version '8.3.8'\n",
        "}\n", 
        "\n", 
        "// This is the path of the main class, stored within ./src/main/java/\n", 
        "mainClassName = 'samples.quickstart.WordCount'\n", 
        "\n", 
        "// Declare the sources from which to fetch dependencies.\n", 
        "repositories {\n", 
        "  mavenCentral()\n", 
        "}\n", 
        "\n", 
        "// Java version compatibility.\n", 
        "sourceCompatibility = 1.8\n", 
        "targetCompatibility = 1.8\n", 
        "\n", 
        "// Use the latest Apache Beam major version 2.\n", 
        "// You can also lock into a minor version like '2.9.+'.\n", 
        "ext.apacheBeamVersion = '2.+'\n", 
        "\n", 
        "// Declare the dependencies of the project.\n", 
        "dependencies {\n", 
        "  shadow \"org.apache.beam:beam-sdks-java-core:$apacheBeamVersion\"\n", 
        "\n", 
        "  runtime \"org.apache.beam:beam-runners-direct-java:$apacheBeamVersion\"\n", 
        "  runtime \"org.slf4j:slf4j-api:1.+\"\n", 
        "  runtime \"org.slf4j:slf4j-jdk14:1.+\"\n", 
        "\n", 
        "  testCompile \"junit:junit:4.+\"\n", 
        "}\n", 
        "\n", 
        "// Configure 'shadowJar' instead of 'jar' to set up the fat jar.\n", 
        "shadowJar {\n", 
        "  baseName = 'WordCount'  // Name of the fat jar file.\n", 
        "  classifier = null       // Set to null, otherwise 'shadow' appends a '-all' to the jar file name.\n", 
        "  manifest {\n", 
        "    attributes('Main-Class': mainClassName)  // Specify where the main class resides.\n", 
        "  }\n", 
        "}"
      ], 
      "execution_count": 4, 
      "outputs": [
        {
          "output_type": "stream", 
          "text": [
            "Writing build.gradle\n"
          ], 
          "name": "stdout"
        }
      ]
    }, 
    {
      "metadata": {
        "id": "cwZcqmFgoLJ9", 
        "colab_type": "text"
      }, 
      "cell_type": "markdown", 
      "source": [
        "## Creating the directory structure\n", 
        "\n", 
        "Java and Gradle expect a specific [directory structure](https://docs.gradle.org/current/userguide/organizing_gradle_projects.html). This helps organize large projects into a standard structure.\n", 
        "\n", 
        "For now, we only need a place where our quickstart code will reside. That has to go within `./src/main/java/`."
      ]
    }, 
    {
      "metadata": {
        "id": "Mr1KTQznbd9F", 
        "colab_type": "code", 
        "outputId": "2e4635b9-0577-4399-b8d6-078183ff9da2", 
        "colab": {
          "base_uri": "https://localhost:8080/", 
          "height": 51
        }
      }, 
      "cell_type": "code", 
      "source": [
        "run('mkdir -p src/main/java/samples/quickstart')"
      ], 
      "execution_count": 5, 
      "outputs": [
        {
          "output_type": "stream", 
          "text": [
            ">> mkdir -p src/main/java/samples/quickstart\n", 
            "\n"
          ], 
          "name": "stdout"
        }
      ]
    }, 
    {
      "metadata": {
        "id": "cPvvFB19uXNw", 
        "colab_type": "text"
      }, 
      "cell_type": "markdown", 
      "source": [
        "# Minimal word count\n", 
        "\n", 
        "The following example is the \"Hello, World!\" of data processing, a basic implementation of word count. We're creating a simple data processing pipeline that reads a text file and counts the number of occurrences of every word.\n", 
        "\n", 
        "There are many scenarios where all the data does not fit in memory. Notice that the outputs of the pipeline go to the file system, which allows for large processing jobs in distributed environments."
      ]
    }, 
    {
      "metadata": {
        "id": "Fl3iUat7KYIE", 
        "colab_type": "text"
      }, 
      "cell_type": "markdown", 
      "source": [
        "## WordCount.java"
      ]
    }, 
    {
      "metadata": {
        "id": "5l3S2mjMBKhT", 
        "colab_type": "code", 
        "outputId": "6e55ec70-e727-44c9-a425-4afed97188fe", 
        "colab": {
          "base_uri": "https://localhost:8080/", 
          "height": 34
        }
      }, 
      "cell_type": "code", 
      "source": [
        "%%writefile src/main/java/samples/quickstart/WordCount.java\n", 
        "\n", 
        "package samples.quickstart;\n", 
        "\n", 
        "import org.apache.beam.sdk.Pipeline;\n", 
        "import org.apache.beam.sdk.io.TextIO;\n", 
        "import org.apache.beam.sdk.options.PipelineOptions;\n", 
        "import org.apache.beam.sdk.options.PipelineOptionsFactory;\n", 
        "import org.apache.beam.sdk.transforms.Count;\n", 
        "import org.apache.beam.sdk.transforms.Filter;\n", 
        "import org.apache.beam.sdk.transforms.FlatMapElements;\n", 
        "import org.apache.beam.sdk.transforms.MapElements;\n", 
        "import org.apache.beam.sdk.values.KV;\n", 
        "import org.apache.beam.sdk.values.TypeDescriptors;\n", 
        "\n", 
        "import java.util.Arrays;\n", 
        "\n", 
        "public class WordCount {\n", 
        "  public static void main(String[] args) {\n", 
        "    String inputsDir = \"data/*\";\n", 
        "    String outputsPrefix = \"outputs/part\";\n", 
        "\n", 
        "    PipelineOptions options = PipelineOptionsFactory.fromArgs(args).create();\n", 
        "    Pipeline pipeline = Pipeline.create(options);\n", 
        "    pipeline\n", 
        "        .apply(\"Read lines\", TextIO.read().from(inputsDir))\n", 
        "        .apply(\"Find words\", FlatMapElements.into(TypeDescriptors.strings())\n", 
        "            .via((String line) -> Arrays.asList(line.split(\"[^\\\\p{L}]+\"))))\n", 
        "        .apply(\"Filter empty words\", Filter.by((String word) -> !word.isEmpty()))\n", 
        "        .apply(\"Count words\", Count.perElement())\n", 
        "        .apply(\"Write results\", MapElements.into(TypeDescriptors.strings())\n", 
        "            .via((KV<String, Long> wordCount) ->\n", 
        "                  wordCount.getKey() + \": \" + wordCount.getValue()))\n", 
        "        .apply(TextIO.write().to(outputsPrefix));\n", 
        "    pipeline.run();\n", 
        "  }\n", 
        "}"
      ], 
      "execution_count": 6, 
      "outputs": [
        {
          "output_type": "stream", 
          "text": [
            "Writing src/main/java/samples/quickstart/WordCount.java\n"
          ], 
          "name": "stdout"
        }
      ]
    }, 
    {
      "metadata": {
        "id": "yoO4xHnaKiz9", 
        "colab_type": "text"
      }, 
      "cell_type": "markdown", 
      "source": [
        "## Build and run"
      ]
    }, 
    {
      "metadata": {
        "id": "giJMbbcq2OPu", 
        "colab_type": "text"
      }, 
      "cell_type": "markdown", 
      "source": [
        "Let's first check how the final file system structure looks like. These are all the files required to build and run our application.\n", 
        "\n", 
        "* `build.gradle` - build configuration for Gradle\n", 
        "* `src/main/java/samples/quickstart/WordCount.java` - application source code\n", 
        "* `data/kinglear.txt` - input data, this could be any file or files\n", 
        "\n", 
        "We are now ready to build the application using `gradle build`."
      ]
    }, 
    {
      "metadata": {
        "id": "urmCmtG08F-0", 
        "colab_type": "code", 
        "outputId": "a2b65437-4244-4844-82d2-1789d5cfd7ca", 
        "colab": {
          "base_uri": "https://localhost:8080/", 
          "height": 510
        }
      }, 
      "cell_type": "code", 
      "source": [
        "# Build the project.\n", 
        "gradle('build')\n", 
        "\n", 
        "# Check the generated build files.\n", 
        "run('ls -lh build/libs/')"
      ], 
      "execution_count": 11, 
      "outputs": [
        {
          "output_type": "stream", 
          "text": [
            ">> /opt/gradle-5.0/bin/gradle --console=plain build\n", 
            "\u001b[mStarting a Gradle Daemon (subsequent builds will be faster)\n", 
            "> Task :compileJava\n", 
            "> Task :processResources NO-SOURCE\n", 
            "> Task :classes\n", 
            "> Task :jar\n", 
            "> Task :startScripts\n", 
            "> Task :distTar\n", 
            "> Task :distZip\n", 
            "> Task :shadowJar\n", 
            "> Task :startShadowScripts\n", 
            "> Task :shadowDistTar\n", 
            "> Task :shadowDistZip\n", 
            "> Task :assemble\n", 
            "> Task :compileTestJava NO-SOURCE\n", 
            "> Task :processTestResources NO-SOURCE\n", 
            "> Task :testClasses UP-TO-DATE\n", 
            "> Task :test NO-SOURCE\n", 
            "> Task :check UP-TO-DATE\n", 
            "> Task :build\n", 
            "\n", 
            "BUILD SUCCESSFUL in 56s\n", 
            "9 actionable tasks: 9 executed\n", 
            "\u001b[m\n", 
            ">> ls -lh build/libs/\n", 
            "total 40M\n", 
            "-rw-r--r-- 1 root root 2.9K Mar  4 22:59 content.jar\n", 
            "-rw-r--r-- 1 root root  40M Mar  4 23:00 WordCount.jar\n", 
            "\n"
          ], 
          "name": "stdout"
        }
      ]
    }, 
    {
      "metadata": {
        "id": "LrRFNZHD8dtu", 
        "colab_type": "text"
      }, 
      "cell_type": "markdown", 
      "source": [
        "There are two files generated:\n", 
        "* The `content.jar` file, the application generated from the regular `build` command. It's only a few kilobytes in size.\n", 
        "* The `WordCount.jar` file, with the `baseName` we specified in the `shadowJar` section of the `gradle.build` file. It's a several megabytes in size, with all the required libraries it needs to run embedded in it.\n", 
        "\n", 
        "The file we're actually interested in is the fat JAR file `WordCount.jar`. To run the fat JAR, we'll use the `gradle runShadow` command."
      ]
    }, 
    {
      "metadata": {
        "id": "CgTXBdTsBn1F", 
        "colab_type": "code", 
        "outputId": "5e447cf9-a01a-4a82-9237-676f0091d4bd", 
        "colab": {
          "base_uri": "https://localhost:8080/", 
          "height": 1822
        }
      }, 
      "cell_type": "code", 
      "source": [
        "# Run the shadow (fat jar) build.\n", 
        "gradle('runShadow')\n", 
        "\n", 
        "# Sample the first 20 results, remember there are no ordering guarantees.\n", 
        "run('head -n 20 outputs/part-00000-of-*')"
      ], 
      "execution_count": 12, 
      "outputs": [
        {
          "output_type": "stream", 
          "text": [
            ">> /opt/gradle-5.0/bin/gradle --console=plain runShadow\n", 
            "\u001b[m> Task :compileJava UP-TO-DATE\n", 
            "> Task :processResources NO-SOURCE\n", 
            "> Task :classes UP-TO-DATE\n", 
            "> Task :shadowJar UP-TO-DATE\n", 
            "> Task :startShadowScripts UP-TO-DATE\n", 
            "> Task :installShadowDist\n", 
            "\n", 
            "> Task :runShadow\n", 
            "WARNING: An illegal reflective access operation has occurred\n", 
            "WARNING: Illegal reflective access by org.apache.beam.vendor.grpc.v1p43p2.com.google.protobuf.UnsafeUtil (file:/content/build/install/content-shadow/lib/WordCount.jar) to field java.nio.Buffer.address\n",
            "WARNING: Please consider reporting this to the maintainers of org.apache.beam.vendor.grpc.v1p43p2.com.google.protobuf.UnsafeUtil\n",
            "WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations\n", 
            "WARNING: All illegal access operations will be denied in a future release\n", 
            "Mar 04, 2019 11:00:24 PM org.apache.beam.sdk.io.FileBasedSource getEstimatedSizeBytes\n", 
            "INFO: Filepattern data/* matched 1 files with total size 157283\n", 
            "Mar 04, 2019 11:00:24 PM org.apache.beam.sdk.io.FileBasedSource split\n", 
            "INFO: Splitting filepattern data/* into bundles of size 52427 took 1 ms and produced 1 files and 3 bundles\n", 
            "Mar 04, 2019 11:00:43 PM org.apache.beam.sdk.io.WriteFiles$WriteShardsIntoTempFilesFn processElement\n", 
            "INFO: Opening writer 7d12bbc4-9165-4493-8563-fb710b827daa for window org.apache.beam.sdk.transforms.windowing.GlobalWindow@3ad2e17 pane PaneInfo{isFirst=true, isLast=true, timing=ON_TIME, index=0, onTimeIndex=0} destination null\n", 
            "Mar 04, 2019 11:00:43 PM org.apache.beam.sdk.io.WriteFiles$WriteShardsIntoTempFilesFn processElement\n", 
            "INFO: Opening writer 5b1bdb18-9f9a-47cd-80d2-a65baa31aa60 for window org.apache.beam.sdk.transforms.windowing.GlobalWindow@3ad2e17 pane PaneInfo{isFirst=true, isLast=true, timing=ON_TIME, index=0, onTimeIndex=0} destination null\n", 
            "Mar 04, 2019 11:00:43 PM org.apache.beam.sdk.io.WriteFiles$WriteShardsIntoTempFilesFn processElement\n", 
            "INFO: Opening writer 6302e6b5-5428-48e6-b571-76a9282d7f45 for window org.apache.beam.sdk.transforms.windowing.GlobalWindow@3ad2e17 pane PaneInfo{isFirst=true, isLast=true, timing=ON_TIME, index=0, onTimeIndex=0} destination null\n", 
            "Mar 04, 2019 11:00:43 PM org.apache.beam.sdk.io.FileBasedSink$Writer close\n", 
            "INFO: Successfully wrote temporary file /content/outputs/.temp-beam-2019-03-04_23-00-23-1/7d12bbc4-9165-4493-8563-fb710b827daa\n", 
            "Mar 04, 2019 11:00:43 PM org.apache.beam.sdk.io.FileBasedSink$Writer close\n", 
            "INFO: Successfully wrote temporary file /content/outputs/.temp-beam-2019-03-04_23-00-23-1/5b1bdb18-9f9a-47cd-80d2-a65baa31aa60\n", 
            "Mar 04, 2019 11:00:43 PM org.apache.beam.sdk.io.WriteFiles$WriteShardsIntoTempFilesFn processElement\n", 
            "INFO: Opening writer 493e3ec4-f0f7-4d10-8209-079f7ac4db16 for window org.apache.beam.sdk.transforms.windowing.GlobalWindow@3ad2e17 pane PaneInfo{isFirst=true, isLast=true, timing=ON_TIME, index=0, onTimeIndex=0} destination null\n", 
            "Mar 04, 2019 11:00:43 PM org.apache.beam.sdk.io.FileBasedSink$Writer close\n", 
            "INFO: Successfully wrote temporary file /content/outputs/.temp-beam-2019-03-04_23-00-23-1/6302e6b5-5428-48e6-b571-76a9282d7f45\n", 
            "Mar 04, 2019 11:00:43 PM org.apache.beam.sdk.io.FileBasedSink$Writer close\n", 
            "INFO: Successfully wrote temporary file /content/outputs/.temp-beam-2019-03-04_23-00-23-1/493e3ec4-f0f7-4d10-8209-079f7ac4db16\n", 
            "Mar 04, 2019 11:00:43 PM org.apache.beam.sdk.io.WriteFiles$FinalizeTempFileBundles$FinalizeFn process\n", 
            "INFO: Finalizing 4 file results\n", 
            "Mar 04, 2019 11:00:43 PM org.apache.beam.sdk.io.FileBasedSink$WriteOperation createMissingEmptyShards\n", 
            "INFO: Finalizing for destination null num shards 4.\n", 
            "Mar 04, 2019 11:00:43 PM org.apache.beam.sdk.io.FileBasedSink$WriteOperation moveToOutputFiles\n", 
            "INFO: Will copy temporary file FileResult{tempFilename=/content/outputs/.temp-beam-2019-03-04_23-00-23-1/7d12bbc4-9165-4493-8563-fb710b827daa, shard=3, window=org.apache.beam.sdk.transforms.windowing.GlobalWindow@3ad2e17, paneInfo=PaneInfo{isFirst=true, isLast=true, timing=ON_TIME, index=0, onTimeIndex=0}} to final location /content/outputs/part-00003-of-00004\n", 
            "Mar 04, 2019 11:00:43 PM org.apache.beam.sdk.io.FileBasedSink$WriteOperation moveToOutputFiles\n", 
            "INFO: Will copy temporary file FileResult{tempFilename=/content/outputs/.temp-beam-2019-03-04_23-00-23-1/5b1bdb18-9f9a-47cd-80d2-a65baa31aa60, shard=2, window=org.apache.beam.sdk.transforms.windowing.GlobalWindow@3ad2e17, paneInfo=PaneInfo{isFirst=true, isLast=true, timing=ON_TIME, index=0, onTimeIndex=0}} to final location /content/outputs/part-00002-of-00004\n", 
            "Mar 04, 2019 11:00:43 PM org.apache.beam.sdk.io.FileBasedSink$WriteOperation moveToOutputFiles\n", 
            "INFO: Will copy temporary file FileResult{tempFilename=/content/outputs/.temp-beam-2019-03-04_23-00-23-1/6302e6b5-5428-48e6-b571-76a9282d7f45, shard=1, window=org.apache.beam.sdk.transforms.windowing.GlobalWindow@3ad2e17, paneInfo=PaneInfo{isFirst=true, isLast=true, timing=ON_TIME, index=0, onTimeIndex=0}} to final location /content/outputs/part-00001-of-00004\n", 
            "Mar 04, 2019 11:00:43 PM org.apache.beam.sdk.io.FileBasedSink$WriteOperation moveToOutputFiles\n", 
            "INFO: Will copy temporary file FileResult{tempFilename=/content/outputs/.temp-beam-2019-03-04_23-00-23-1/493e3ec4-f0f7-4d10-8209-079f7ac4db16, shard=0, window=org.apache.beam.sdk.transforms.windowing.GlobalWindow@3ad2e17, paneInfo=PaneInfo{isFirst=true, isLast=true, timing=ON_TIME, index=0, onTimeIndex=0}} to final location /content/outputs/part-00000-of-00004\n", 
            "Mar 04, 2019 11:00:43 PM org.apache.beam.sdk.io.FileBasedSink$WriteOperation removeTemporaryFiles\n", 
            "INFO: Will remove known temporary file /content/outputs/.temp-beam-2019-03-04_23-00-23-1/6302e6b5-5428-48e6-b571-76a9282d7f45\n", 
            "Mar 04, 2019 11:00:43 PM org.apache.beam.sdk.io.FileBasedSink$WriteOperation removeTemporaryFiles\n", 
            "INFO: Will remove known temporary file /content/outputs/.temp-beam-2019-03-04_23-00-23-1/5b1bdb18-9f9a-47cd-80d2-a65baa31aa60\n", 
            "Mar 04, 2019 11:00:43 PM org.apache.beam.sdk.io.FileBasedSink$WriteOperation removeTemporaryFiles\n", 
            "INFO: Will remove known temporary file /content/outputs/.temp-beam-2019-03-04_23-00-23-1/7d12bbc4-9165-4493-8563-fb710b827daa\n", 
            "Mar 04, 2019 11:00:43 PM org.apache.beam.sdk.io.FileBasedSink$WriteOperation removeTemporaryFiles\n", 
            "INFO: Will remove known temporary file /content/outputs/.temp-beam-2019-03-04_23-00-23-1/493e3ec4-f0f7-4d10-8209-079f7ac4db16\n", 
            "Mar 04, 2019 11:00:43 PM org.apache.beam.sdk.io.FileBasedSink$WriteOperation removeTemporaryFiles\n", 
            "WARNING: Failed to match temporary files under: [/content/outputs/.temp-beam-2019-03-04_23-00-23-1/].\n", 
            "\n", 
            "BUILD SUCCESSFUL in 24s\n", 
            "5 actionable tasks: 2 executed, 3 up-to-date\n", 
            "\u001b[m\n", 
            ">> head -n 20 outputs/part-00000-of-*\n", 
            "==> outputs/part-00000-of-00001 <==\n", 
            "(u'canker', 1)\n", 
            "(u'bounty', 2)\n", 
            "(u'provision', 3)\n", 
            "(u'to', 438)\n", 
            "(u'terms', 2)\n", 
            "(u'unnecessary', 2)\n", 
            "(u'tongue', 5)\n", 
            "(u'knives', 1)\n", 
            "(u'Commend', 1)\n", 
            "(u'Hum', 2)\n", 
            "(u'Set', 2)\n", 
            "(u'smell', 6)\n", 
            "(u'dreadful', 3)\n", 
            "(u'frowning', 1)\n", 
            "(u'World', 1)\n", 
            "(u'tike', 1)\n", 
            "(u'yes', 3)\n", 
            "(u'oldness', 1)\n", 
            "(u'boat', 1)\n", 
            "(u\"in's\", 1)\n", 
            "\n", 
            "==> outputs/part-00000-of-00004 <==\n", 
            "retinue: 1\n", 
            "stink: 1\n", 
            "beaks: 1\n", 
            "Ten: 1\n", 
            "riots: 2\n", 
            "Service: 1\n", 
            "dealing: 1\n", 
            "stop: 2\n", 
            "detain: 1\n", 
            "beware: 1\n", 
            "pilferings: 1\n", 
            "swimming: 1\n", 
            "The: 124\n", 
            "Been: 1\n", 
            "behavior: 1\n", 
            "impetuous: 1\n", 
            "Thy: 20\n", 
            "Tis: 24\n", 
            "Soldiers: 7\n", 
            "Juno: 1\n", 
            "\n"
          ], 
          "name": "stdout"
        }
      ]
    }, 
    {
      "metadata": {
        "id": "T_oqlIM55MzM", 
        "colab_type": "text"
      }, 
      "cell_type": "markdown", 
      "source": [
        "## Distributing your application\n", 
        "\n", 
        "We can run our fat JAR file as long as we have a Java Runtime Environment installed.\n", 
        "\n", 
        "To distribute, we copy the fat JAR file and run it with `java -jar`."
      ]
    }, 
    {
      "metadata": {
        "id": "b3YSRjYnavpd", 
        "colab_type": "code", 
        "outputId": "ef88153a-f75f-4e80-8434-ac452a77a199", 
        "colab": {
          "base_uri": "https://localhost:8080/", 
          "height": 1907
        }
      }, 
      "cell_type": "code", 
      "source": [
        "# You can now distribute and run your Java application as a standalone jar file.\n", 
        "run('cp build/libs/WordCount.jar .')\n", 
        "run('java -jar WordCount.jar')\n", 
        "\n", 
        "# Sample the first 20 results, remember there are no ordering guarantees.\n", 
        "run('head -n 20 outputs/part-00000-of-*')"
      ], 
      "execution_count": 13, 
      "outputs": [
        {
          "output_type": "stream", 
          "text": [
            ">> cp build/libs/WordCount.jar .\n", 
            "\n", 
            ">> java -jar WordCount.jar\n", 
            "WARNING: An illegal reflective access operation has occurred\n", 
            "WARNING: Illegal reflective access by org.apache.beam.vendor.grpc.v1p43p2.com.google.protobuf.UnsafeUtil (file:/content/WordCount.jar) to field java.nio.Buffer.address\n",
            "WARNING: Please consider reporting this to the maintainers of org.apache.beam.vendor.grpc.v1p43p2.com.google.protobuf.UnsafeUtil\n",
            "WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations\n", 
            "WARNING: All illegal access operations will be denied in a future release\n", 
            "Mar 04, 2019 11:00:49 PM org.apache.beam.sdk.io.FileBasedSource getEstimatedSizeBytes\n", 
            "INFO: Filepattern data/* matched 1 files with total size 157283\n", 
            "Mar 04, 2019 11:00:49 PM org.apache.beam.sdk.io.FileBasedSource split\n", 
            "INFO: Splitting filepattern data/* into bundles of size 52427 took 1 ms and produced 1 files and 3 bundles\n", 
            "Mar 04, 2019 11:01:10 PM org.apache.beam.sdk.io.WriteFiles$WriteShardsIntoTempFilesFn processElement\n", 
            "INFO: Opening writer 273fc5ad-09b8-4e87-95c9-5d9ec72ed294 for window org.apache.beam.sdk.transforms.windowing.GlobalWindow@7a362b6b pane PaneInfo{isFirst=true, isLast=true, timing=ON_TIME, index=0, onTimeIndex=0} destination null\n", 
            "Mar 04, 2019 11:01:10 PM org.apache.beam.sdk.io.WriteFiles$WriteShardsIntoTempFilesFn processElement\n", 
            "INFO: Opening writer c224db69-5869-4259-bd43-ca0431ec77fe for window org.apache.beam.sdk.transforms.windowing.GlobalWindow@7a362b6b pane PaneInfo{isFirst=true, isLast=true, timing=ON_TIME, index=0, onTimeIndex=0} destination null\n", 
            "Mar 04, 2019 11:01:10 PM org.apache.beam.sdk.io.WriteFiles$WriteShardsIntoTempFilesFn processElement\n", 
            "INFO: Opening writer f45d6e07-d37a-4af3-ad8b-bc316cef7d99 for window org.apache.beam.sdk.transforms.windowing.GlobalWindow@7a362b6b pane PaneInfo{isFirst=true, isLast=true, timing=ON_TIME, index=0, onTimeIndex=0} destination null\n", 
            "Mar 04, 2019 11:01:10 PM org.apache.beam.sdk.io.FileBasedSink$Writer close\n", 
            "INFO: Successfully wrote temporary file /content/outputs/.temp-beam-2019-03-04_23-00-49-1/f45d6e07-d37a-4af3-ad8b-bc316cef7d99\n", 
            "Mar 04, 2019 11:01:10 PM org.apache.beam.sdk.io.FileBasedSink$Writer close\n", 
            "INFO: Successfully wrote temporary file /content/outputs/.temp-beam-2019-03-04_23-00-49-1/c224db69-5869-4259-bd43-ca0431ec77fe\n", 
            "Mar 04, 2019 11:01:10 PM org.apache.beam.sdk.io.FileBasedSink$Writer close\n", 
            "INFO: Successfully wrote temporary file /content/outputs/.temp-beam-2019-03-04_23-00-49-1/273fc5ad-09b8-4e87-95c9-5d9ec72ed294\n", 
            "Mar 04, 2019 11:01:10 PM org.apache.beam.sdk.io.WriteFiles$FinalizeTempFileBundles$FinalizeFn process\n", 
            "INFO: Finalizing 3 file results\n", 
            "Mar 04, 2019 11:01:10 PM org.apache.beam.sdk.io.FileBasedSink$WriteOperation createMissingEmptyShards\n", 
            "INFO: Finalizing for destination null num shards 3.\n", 
            "Mar 04, 2019 11:01:10 PM org.apache.beam.sdk.io.FileBasedSink$WriteOperation moveToOutputFiles\n", 
            "INFO: Will copy temporary file FileResult{tempFilename=/content/outputs/.temp-beam-2019-03-04_23-00-49-1/273fc5ad-09b8-4e87-95c9-5d9ec72ed294, shard=2, window=org.apache.beam.sdk.transforms.windowing.GlobalWindow@7a362b6b, paneInfo=PaneInfo{isFirst=true, isLast=true, timing=ON_TIME, index=0, onTimeIndex=0}} to final location /content/outputs/part-00002-of-00003\n", 
            "Mar 04, 2019 11:01:10 PM org.apache.beam.sdk.io.FileBasedSink$WriteOperation moveToOutputFiles\n", 
            "INFO: Will copy temporary file FileResult{tempFilename=/content/outputs/.temp-beam-2019-03-04_23-00-49-1/c224db69-5869-4259-bd43-ca0431ec77fe, shard=0, window=org.apache.beam.sdk.transforms.windowing.GlobalWindow@7a362b6b, paneInfo=PaneInfo{isFirst=true, isLast=true, timing=ON_TIME, index=0, onTimeIndex=0}} to final location /content/outputs/part-00000-of-00003\n", 
            "Mar 04, 2019 11:01:10 PM org.apache.beam.sdk.io.FileBasedSink$WriteOperation moveToOutputFiles\n", 
            "INFO: Will copy temporary file FileResult{tempFilename=/content/outputs/.temp-beam-2019-03-04_23-00-49-1/f45d6e07-d37a-4af3-ad8b-bc316cef7d99, shard=1, window=org.apache.beam.sdk.transforms.windowing.GlobalWindow@7a362b6b, paneInfo=PaneInfo{isFirst=true, isLast=true, timing=ON_TIME, index=0, onTimeIndex=0}} to final location /content/outputs/part-00001-of-00003\n", 
            "Mar 04, 2019 11:01:10 PM org.apache.beam.sdk.io.FileBasedSink$WriteOperation removeTemporaryFiles\n", 
            "INFO: Will remove known temporary file /content/outputs/.temp-beam-2019-03-04_23-00-49-1/273fc5ad-09b8-4e87-95c9-5d9ec72ed294\n", 
            "Mar 04, 2019 11:01:10 PM org.apache.beam.sdk.io.FileBasedSink$WriteOperation removeTemporaryFiles\n", 
            "INFO: Will remove known temporary file /content/outputs/.temp-beam-2019-03-04_23-00-49-1/f45d6e07-d37a-4af3-ad8b-bc316cef7d99\n", 
            "Mar 04, 2019 11:01:10 PM org.apache.beam.sdk.io.FileBasedSink$WriteOperation removeTemporaryFiles\n", 
            "INFO: Will remove known temporary file /content/outputs/.temp-beam-2019-03-04_23-00-49-1/c224db69-5869-4259-bd43-ca0431ec77fe\n", 
            "Mar 04, 2019 11:01:10 PM org.apache.beam.sdk.io.FileBasedSink$WriteOperation removeTemporaryFiles\n", 
            "WARNING: Failed to match temporary files under: [/content/outputs/.temp-beam-2019-03-04_23-00-49-1/].\n", 
            "\n", 
            ">> head -n 20 outputs/part-00000-of-*\n", 
            "==> outputs/part-00000-of-00001 <==\n", 
            "(u'canker', 1)\n", 
            "(u'bounty', 2)\n", 
            "(u'provision', 3)\n", 
            "(u'to', 438)\n", 
            "(u'terms', 2)\n", 
            "(u'unnecessary', 2)\n", 
            "(u'tongue', 5)\n", 
            "(u'knives', 1)\n", 
            "(u'Commend', 1)\n", 
            "(u'Hum', 2)\n", 
            "(u'Set', 2)\n", 
            "(u'smell', 6)\n", 
            "(u'dreadful', 3)\n", 
            "(u'frowning', 1)\n", 
            "(u'World', 1)\n", 
            "(u'tike', 1)\n", 
            "(u'yes', 3)\n", 
            "(u'oldness', 1)\n", 
            "(u'boat', 1)\n", 
            "(u\"in's\", 1)\n", 
            "\n", 
            "==> outputs/part-00000-of-00003 <==\n", 
            "With: 31\n", 
            "justification: 1\n", 
            "hither: 15\n", 
            "make: 46\n", 
            "opposed: 2\n", 
            "prince: 5\n", 
            "Burn: 1\n", 
            "waking: 1\n", 
            "waked: 3\n", 
            "inform: 6\n", 
            "mercy: 5\n", 
            "about: 11\n", 
            "danger: 6\n", 
            "Croak: 1\n", 
            "happier: 1\n", 
            "stick: 2\n", 
            "oppressed: 1\n", 
            "erlook: 1\n", 
            "untented: 1\n", 
            "myself: 10\n", 
            "\n", 
            "==> outputs/part-00000-of-00004 <==\n", 
            "retinue: 1\n", 
            "stink: 1\n", 
            "beaks: 1\n", 
            "Ten: 1\n", 
            "riots: 2\n", 
            "Service: 1\n", 
            "dealing: 1\n", 
            "stop: 2\n", 
            "detain: 1\n", 
            "beware: 1\n", 
            "pilferings: 1\n", 
            "swimming: 1\n", 
            "The: 124\n", 
            "Been: 1\n", 
            "behavior: 1\n", 
            "impetuous: 1\n", 
            "Thy: 20\n", 
            "Tis: 24\n", 
            "Soldiers: 7\n", 
            "Juno: 1\n", 
            "\n"
          ], 
          "name": "stdout"
        }
      ]
    }, 
    {
      "metadata": {
        "id": "k-HubCrk-h_G", 
        "colab_type": "text"
      }, 
      "cell_type": "markdown", 
      "source": [
        "# Word count with comments\n", 
        "\n", 
        "Below is mostly the same code as above, but with comments explaining every line in more detail."
      ]
    }, 
    {
      "metadata": {
        "id": "wvnWyYklCXer", 
        "colab_type": "code", 
        "outputId": "275507a3-05e9-44ca-8625-d745154d5720", 
        "colab": {
          "base_uri": "https://localhost:8080/", 
          "height": 34
        }
      }, 
      "cell_type": "code", 
      "source": [
        "%%writefile src/main/java/samples/quickstart/WordCount.java\n", 
        "\n", 
        "package samples.quickstart;\n", 
        "\n", 
        "import org.apache.beam.sdk.Pipeline;\n", 
        "import org.apache.beam.sdk.io.TextIO;\n", 
        "import org.apache.beam.sdk.options.PipelineOptions;\n", 
        "import org.apache.beam.sdk.options.PipelineOptionsFactory;\n", 
        "import org.apache.beam.sdk.transforms.Count;\n", 
        "import org.apache.beam.sdk.transforms.Filter;\n", 
        "import org.apache.beam.sdk.transforms.FlatMapElements;\n", 
        "import org.apache.beam.sdk.transforms.MapElements;\n", 
        "import org.apache.beam.sdk.values.KV;\n", 
        "import org.apache.beam.sdk.values.PCollection;\n", 
        "import org.apache.beam.sdk.values.TypeDescriptors;\n", 
        "\n", 
        "import java.util.Arrays;\n", 
        "\n", 
        "public class WordCount {\n", 
        "  public static void main(String[] args) {\n", 
        "    String inputsDir = \"data/*\";\n", 
        "    String outputsPrefix = \"outputs/part\";\n", 
        "\n", 
        "    PipelineOptions options = PipelineOptionsFactory.fromArgs(args).create();\n", 
        "    Pipeline pipeline = Pipeline.create(options);\n", 
        "\n", 
        "    // Store the word counts in a PCollection.\n", 
        "    // Each element is a KeyValue of (word, count) of types KV<String, Long>.\n", 
        "    PCollection<KV<String, Long>> wordCounts =\n", 
        "        // The input PCollection is an empty pipeline.\n", 
        "        pipeline\n", 
        "\n", 
        "        // Read lines from a text file.\n", 
        "        .apply(\"Read lines\", TextIO.read().from(inputsDir))\n", 
        "        // Element type: String - text line\n", 
        "\n", 
        "        // Use a regular expression to iterate over all words in the line.\n", 
        "        // FlatMapElements will yield an element for every element in an iterable.\n", 
        "        .apply(\"Find words\", FlatMapElements.into(TypeDescriptors.strings())\n", 
        "            .via((String line) -> Arrays.asList(line.split(\"[^\\\\p{L}]+\"))))\n", 
        "        // Element type: String - word\n", 
        "\n", 
        "        // Keep only non-empty words.\n", 
        "        .apply(\"Filter empty words\", Filter.by((String word) -> !word.isEmpty()))\n", 
        "        // Element type: String - word\n", 
        "\n", 
        "        // Count each unique word.\n", 
        "        .apply(\"Count words\", Count.perElement());\n", 
        "        // Element type: KV<String, Long> - key: word, value: counts\n", 
        "\n", 
        "    // We can process a PCollection through other pipelines, too.\n", 
        "    // The input PCollection are the wordCounts from the previous step.\n", 
        "    wordCounts\n", 
        "        // Format the results into a string so we can write them to a file.\n", 
        "        .apply(\"Write results\", MapElements.into(TypeDescriptors.strings())\n", 
        "            .via((KV<String, Long> wordCount) ->\n", 
        "                  wordCount.getKey() + \": \" + wordCount.getValue()))\n", 
        "        // Element type: str - text line\n", 
        "\n", 
        "        // Finally, write the results to a file.\n", 
        "        .apply(TextIO.write().to(outputsPrefix));\n", 
        "\n", 
        "    // We have to explicitly run the pipeline, otherwise it's only a definition.\n", 
        "    pipeline.run();\n", 
        "  }\n", 
        "}"
      ], 
      "execution_count": 14, 
      "outputs": [
        {
          "output_type": "stream", 
          "text": [
            "Overwriting src/main/java/samples/quickstart/WordCount.java\n"
          ], 
          "name": "stdout"
        }
      ]
    }, 
    {
      "metadata": {
        "id": "wKAJp7ON4Vpp", 
        "colab_type": "code", 
        "outputId": "9a4c7a72-70a1-4d31-89c1-cf7fb8fcdf53", 
        "colab": {
          "base_uri": "https://localhost:8080/", 
          "height": 2060
        }
      }, 
      "cell_type": "code", 
      "source": [
        "# Build and run the project. The 'runShadow' task implicitly does a 'build'.\n", 
        "gradle('runShadow')\n", 
        "\n", 
        "# Sample the first 20 results, remember there are no ordering guarantees.\n", 
        "run('head -n 20 outputs/part-00000-of-*')"
      ], 
      "execution_count": 15, 
      "outputs": [
        {
          "output_type": "stream", 
          "text": [
            ">> /opt/gradle-5.0/bin/gradle --console=plain runShadow\n", 
            "\u001b[m> Task :compileJava\n", 
            "> Task :processResources NO-SOURCE\n", 
            "> Task :classes\n", 
            "> Task :shadowJar\n", 
            "> Task :startShadowScripts\n", 
            "> Task :installShadowDist\n", 
            "\n", 
            "> Task :runShadow\n", 
            "WARNING: An illegal reflective access operation has occurred\n", 
            "WARNING: Illegal reflective access by org.apache.beam.vendor.grpc.v1p43p2.com.google.protobuf.UnsafeUtil (file:/content/build/install/content-shadow/lib/WordCount.jar) to field java.nio.Buffer.address\n",
            "WARNING: Please consider reporting this to the maintainers of org.apache.beam.vendor.grpc.v1p43p2.com.google.protobuf.UnsafeUtil\n",
            "WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations\n", 
            "WARNING: All illegal access operations will be denied in a future release\n", 
            "Mar 04, 2019 11:01:26 PM org.apache.beam.sdk.io.FileBasedSource getEstimatedSizeBytes\n", 
            "INFO: Filepattern data/* matched 1 files with total size 157283\n", 
            "Mar 04, 2019 11:01:26 PM org.apache.beam.sdk.io.FileBasedSource split\n", 
            "INFO: Splitting filepattern data/* into bundles of size 52427 took 1 ms and produced 1 files and 3 bundles\n", 
            "Mar 04, 2019 11:01:46 PM org.apache.beam.sdk.io.WriteFiles$WriteShardsIntoTempFilesFn processElement\n", 
            "INFO: Opening writer e2eeada2-5a8b-4493-acc5-c706204d9669 for window org.apache.beam.sdk.transforms.windowing.GlobalWindow@8c3619e pane PaneInfo{isFirst=true, isLast=true, timing=ON_TIME, index=0, onTimeIndex=0} destination null\n", 
            "Mar 04, 2019 11:01:46 PM org.apache.beam.sdk.io.WriteFiles$WriteShardsIntoTempFilesFn processElement\n", 
            "INFO: Opening writer 7acdc85e-ff7d-42d0-9b2f-9ce385956c0e for window org.apache.beam.sdk.transforms.windowing.GlobalWindow@8c3619e pane PaneInfo{isFirst=true, isLast=true, timing=ON_TIME, index=0, onTimeIndex=0} destination null\n", 
            "Mar 04, 2019 11:01:46 PM org.apache.beam.sdk.io.WriteFiles$WriteShardsIntoTempFilesFn processElement\n", 
            "INFO: Opening writer d1a6a591-77f0-4994-affc-d83378e7b7c0 for window org.apache.beam.sdk.transforms.windowing.GlobalWindow@8c3619e pane PaneInfo{isFirst=true, isLast=true, timing=ON_TIME, index=0, onTimeIndex=0} destination null\n", 
            "Mar 04, 2019 11:01:46 PM org.apache.beam.sdk.io.FileBasedSink$Writer close\n", 
            "INFO: Successfully wrote temporary file /content/outputs/.temp-beam-2019-03-04_23-01-25-1/e2eeada2-5a8b-4493-acc5-c706204d9669\n", 
            "Mar 04, 2019 11:01:46 PM org.apache.beam.sdk.io.FileBasedSink$Writer close\n", 
            "INFO: Successfully wrote temporary file /content/outputs/.temp-beam-2019-03-04_23-01-25-1/7acdc85e-ff7d-42d0-9b2f-9ce385956c0e\n", 
            "Mar 04, 2019 11:01:46 PM org.apache.beam.sdk.io.FileBasedSink$Writer close\n", 
            "INFO: Successfully wrote temporary file /content/outputs/.temp-beam-2019-03-04_23-01-25-1/d1a6a591-77f0-4994-affc-d83378e7b7c0\n", 
            "Mar 04, 2019 11:01:46 PM org.apache.beam.sdk.io.WriteFiles$FinalizeTempFileBundles$FinalizeFn process\n", 
            "INFO: Finalizing 3 file results\n", 
            "Mar 04, 2019 11:01:46 PM org.apache.beam.sdk.io.FileBasedSink$WriteOperation createMissingEmptyShards\n", 
            "INFO: Finalizing for destination null num shards 3.\n", 
            "Mar 04, 2019 11:01:46 PM org.apache.beam.sdk.io.FileBasedSink$WriteOperation moveToOutputFiles\n", 
            "INFO: Will copy temporary file FileResult{tempFilename=/content/outputs/.temp-beam-2019-03-04_23-01-25-1/7acdc85e-ff7d-42d0-9b2f-9ce385956c0e, shard=2, window=org.apache.beam.sdk.transforms.windowing.GlobalWindow@8c3619e, paneInfo=PaneInfo{isFirst=true, isLast=true, timing=ON_TIME, index=0, onTimeIndex=0}} to final location /content/outputs/part-00002-of-00003\n", 
            "Mar 04, 2019 11:01:46 PM org.apache.beam.sdk.io.FileBasedSink$WriteOperation moveToOutputFiles\n", 
            "INFO: Will copy temporary file FileResult{tempFilename=/content/outputs/.temp-beam-2019-03-04_23-01-25-1/e2eeada2-5a8b-4493-acc5-c706204d9669, shard=0, window=org.apache.beam.sdk.transforms.windowing.GlobalWindow@8c3619e, paneInfo=PaneInfo{isFirst=true, isLast=true, timing=ON_TIME, index=0, onTimeIndex=0}} to final location /content/outputs/part-00000-of-00003\n", 
            "Mar 04, 2019 11:01:46 PM org.apache.beam.sdk.io.FileBasedSink$WriteOperation moveToOutputFiles\n", 
            "INFO: Will copy temporary file FileResult{tempFilename=/content/outputs/.temp-beam-2019-03-04_23-01-25-1/d1a6a591-77f0-4994-affc-d83378e7b7c0, shard=1, window=org.apache.beam.sdk.transforms.windowing.GlobalWindow@8c3619e, paneInfo=PaneInfo{isFirst=true, isLast=true, timing=ON_TIME, index=0, onTimeIndex=0}} to final location /content/outputs/part-00001-of-00003\n", 
            "Mar 04, 2019 11:01:46 PM org.apache.beam.sdk.io.FileBasedSink$WriteOperation removeTemporaryFiles\n", 
            "INFO: Will remove known temporary file /content/outputs/.temp-beam-2019-03-04_23-01-25-1/e2eeada2-5a8b-4493-acc5-c706204d9669\n", 
            "Mar 04, 2019 11:01:46 PM org.apache.beam.sdk.io.FileBasedSink$WriteOperation removeTemporaryFiles\n", 
            "INFO: Will remove known temporary file /content/outputs/.temp-beam-2019-03-04_23-01-25-1/7acdc85e-ff7d-42d0-9b2f-9ce385956c0e\n", 
            "Mar 04, 2019 11:01:46 PM org.apache.beam.sdk.io.FileBasedSink$WriteOperation removeTemporaryFiles\n", 
            "INFO: Will remove known temporary file /content/outputs/.temp-beam-2019-03-04_23-01-25-1/d1a6a591-77f0-4994-affc-d83378e7b7c0\n", 
            "Mar 04, 2019 11:01:46 PM org.apache.beam.sdk.io.FileBasedSink$WriteOperation removeTemporaryFiles\n", 
            "WARNING: Failed to match temporary files under: [/content/outputs/.temp-beam-2019-03-04_23-01-25-1/].\n", 
            "\n", 
            "BUILD SUCCESSFUL in 33s\n", 
            "5 actionable tasks: 5 executed\n", 
            "\u001b[m\n", 
            ">> head -n 20 outputs/part-00000-of-*\n", 
            "==> outputs/part-00000-of-00001 <==\n", 
            "(u'canker', 1)\n", 
            "(u'bounty', 2)\n", 
            "(u'provision', 3)\n", 
            "(u'to', 438)\n", 
            "(u'terms', 2)\n", 
            "(u'unnecessary', 2)\n", 
            "(u'tongue', 5)\n", 
            "(u'knives', 1)\n", 
            "(u'Commend', 1)\n", 
            "(u'Hum', 2)\n", 
            "(u'Set', 2)\n", 
            "(u'smell', 6)\n", 
            "(u'dreadful', 3)\n", 
            "(u'frowning', 1)\n", 
            "(u'World', 1)\n", 
            "(u'tike', 1)\n", 
            "(u'yes', 3)\n", 
            "(u'oldness', 1)\n", 
            "(u'boat', 1)\n", 
            "(u\"in's\", 1)\n", 
            "\n", 
            "==> outputs/part-00000-of-00003 <==\n", 
            "wrath: 3\n", 
            "nicely: 2\n", 
            "hall: 1\n", 
            "Sure: 2\n", 
            "legs: 4\n", 
            "ten: 1\n", 
            "yourselves: 1\n", 
            "embossed: 1\n", 
            "poorly: 1\n", 
            "temper: 2\n", 
            "Dismissing: 1\n", 
            "Legitimate: 1\n", 
            "tyrannous: 1\n", 
            "turn: 13\n", 
            "gold: 2\n", 
            "minds: 1\n", 
            "dowers: 2\n", 
            "policy: 1\n", 
            "I: 708\n", 
            "V: 6\n", 
            "\n", 
            "==> outputs/part-00000-of-00004 <==\n", 
            "retinue: 1\n", 
            "stink: 1\n", 
            "beaks: 1\n", 
            "Ten: 1\n", 
            "riots: 2\n", 
            "Service: 1\n", 
            "dealing: 1\n", 
            "stop: 2\n", 
            "detain: 1\n", 
            "beware: 1\n", 
            "pilferings: 1\n", 
            "swimming: 1\n", 
            "The: 124\n", 
            "Been: 1\n", 
            "behavior: 1\n", 
            "impetuous: 1\n", 
            "Thy: 20\n", 
            "Tis: 24\n", 
            "Soldiers: 7\n", 
            "Juno: 1\n", 
            "\n"
          ], 
          "name": "stdout"
        }
      ]
    }
  ]
}
